package com.haide.channel.pro.util;

import com.haide.channel.pro.enums.ErrorCodeEnum;
import com.haide.channel.pro.exception.BaseException;
import com.haide.channel.pro.exception.ErrorCode;
import com.haide.channel.pro.pojo.Result;
import org.apache.commons.lang3.StringUtils;


/**
 * 公共异常处理
 * User: 香克斯 Date: 2016/03/23 ProductName: yunfoo-commons Version: 1.0
 */
public class ExceptionUtils {

    /**
     * 统一异常处理
     *
     * @param err 异常
     * @return 外部响应对象
     */
    public static String getErrorMsg(Throwable err) {

        return getErrorCode(err).getErrorDesc();
    }

    /**
     * 接口错误信息组装
     *
     * @param err 错误信息
     * @param <T> 返回结果类型
     * @return 返回组装错误信息
     */
    public static <T> Result<T> getResponse(Throwable err) {

        ErrorCode errorCode = getErrorCode(err);

        return new Result<>(errorCode.getErrorCode(), errorCode.getErrorDesc());
    }


    /**
     * 接口错误信息组装
     *
     * @param err 错误信息
     * @return 返回组装错误信息
     */
    public static ErrorCode getErrorCode(Throwable err) {
        try {
            //业务异常
            if (err instanceof BaseException) {
                BaseException e = (BaseException) err;
                String errorMsg = (StringUtils.isBlank(e.getExtraMsg()) ?
                        e.getErrorCode().getErrorDesc() : e.getExtraMsg());
                ErrorCode errorCode = e.getErrorCode();
                errorCode.setErrorDesc(errorMsg);
                return errorCode;
            }

            //参数转换异常
            if (err instanceof IllegalArgumentException) {
                return ErrorCodeEnum.PARAMETER_VALID_NOT_PASS;
            }
            //系统内部异常
            return ErrorCodeEnum.SYSTEM_INNER_ERROR;
        } catch (Exception e) {
            return ErrorCodeEnum.SYSTEM_INNER_ERROR;
        }
    }
}
